package com.cencat.driver.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cencat.driver.entity.DriverMessage;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 司机消息服务接口
 * 
 * @author cencat
 * @since 2024-01-01
 */
public interface DriverMessageService extends IService<DriverMessage> {

    /**
     * 根据司机ID查询消息列表
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 消息列表
     */
    List<DriverMessage> getByDriverId(Long driverId, Long tenantId);

    /**
     * 根据消息类型查询消息列表
     * 
     * @param messageType 消息类型
     * @param tenantId 租户ID
     * @return 消息列表
     */
    List<DriverMessage> getByMessageType(Integer messageType, Long tenantId);

    /**
     * 查询司机未读消息列表
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 未读消息列表
     */
    List<DriverMessage> getUnreadMessages(Long driverId, Long tenantId);

    /**
     * 查询司机已读消息列表
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 已读消息列表
     */
    List<DriverMessage> getReadMessages(Long driverId, Long tenantId);

    /**
     * 分页查询司机消息列表
     * 
     * @param current 当前页
     * @param size 每页大小
     * @param driverId 司机ID
     * @param messageType 消息类型
     * @param isRead 是否已读
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param tenantId 租户ID
     * @return 分页结果
     */
    IPage<DriverMessage> getPageList(Long current, Long size, Long driverId, Integer messageType,
                                   Boolean isRead, LocalDateTime startTime, LocalDateTime endTime, Long tenantId);

    /**
     * 发送消息给司机
     * 
     * @param driverId 司机ID
     * @param messageType 消息类型
     * @param title 消息标题
     * @param content 消息内容
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean sendMessage(Long driverId, Integer messageType, String title, String content, Long tenantId);

    /**
     * 批量发送消息给司机
     * 
     * @param driverIds 司机ID列表
     * @param messageType 消息类型
     * @param title 消息标题
     * @param content 消息内容
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean batchSendMessage(List<Long> driverIds, Integer messageType, String title, String content, Long tenantId);

    /**
     * 发送系统通知
     * 
     * @param title 通知标题
     * @param content 通知内容
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean sendSystemNotification(String title, String content, Long tenantId);

    /**
     * 发送任务通知
     * 
     * @param driverId 司机ID
     * @param taskId 任务ID
     * @param title 通知标题
     * @param content 通知内容
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean sendTaskNotification(Long driverId, Long taskId, String title, String content, Long tenantId);

    /**
     * 标记消息为已读
     * 
     * @param id 消息ID
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean markAsRead(Long id, Long driverId, Long tenantId);

    /**
     * 批量标记消息为已读
     * 
     * @param ids 消息ID列表
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean batchMarkAsRead(List<Long> ids, Long driverId, Long tenantId);

    /**
     * 标记所有消息为已读
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean markAllAsRead(Long driverId, Long tenantId);

    /**
     * 标记消息为未读
     * 
     * @param id 消息ID
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean markAsUnread(Long id, Long driverId, Long tenantId);

    /**
     * 删除消息
     * 
     * @param id 消息ID
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean deleteMessage(Long id, Long driverId, Long tenantId);

    /**
     * 批量删除消息
     * 
     * @param ids 消息ID列表
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean batchDeleteMessages(List<Long> ids, Long driverId, Long tenantId);

    /**
     * 清空司机所有消息
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean clearAllMessages(Long driverId, Long tenantId);

    /**
     * 获取司机未读消息数量
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 未读消息数量
     */
    Long getUnreadCount(Long driverId, Long tenantId);

    /**
     * 获取司机消息统计
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 消息统计
     */
    Map<String, Object> getMessageStatistics(Long driverId, Long tenantId);

    /**
     * 获取系统消息统计
     * 
     * @param tenantId 租户ID
     * @return 系统消息统计
     */
    Map<String, Object> getSystemMessageStatistics(Long tenantId);

    /**
     * 清理过期消息
     * 
     * @param expireDays 过期天数
     * @param tenantId 租户ID
     * @return 清理数量
     */
    Integer cleanExpiredMessages(Integer expireDays, Long tenantId);

    /**
     * 推送实时消息
     * 
     * @param driverId 司机ID
     * @param message 消息内容
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean pushRealTimeMessage(Long driverId, String message, Long tenantId);

    /**
     * 获取消息模板
     * 
     * @param templateType 模板类型
     * @param tenantId 租户ID
     * @return 消息模板
     */
    Map<String, Object> getMessageTemplate(String templateType, Long tenantId);

    /**
     * 根据模板发送消息
     * 
     * @param driverId 司机ID
     * @param templateType 模板类型
     * @param params 模板参数
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean sendMessageByTemplate(Long driverId, String templateType, Map<String, Object> params, Long tenantId);

    /**
     * 设置消息免打扰时间
     * 
     * @param driverId 司机ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean setDoNotDisturbTime(Long driverId, String startTime, String endTime, Long tenantId);

    /**
     * 获取消息免打扰设置
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 免打扰设置
     */
    Map<String, Object> getDoNotDisturbSetting(Long driverId, Long tenantId);

    /**
     * 检查是否在免打扰时间内
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否在免打扰时间内
     */
    boolean isInDoNotDisturbTime(Long driverId, Long tenantId);

    /**
     * 消息撤回
     * 
     * @param messageId 消息ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean recallMessage(Long messageId, Long tenantId);

    /**
     * 获取可撤回的消息列表
     * 
     * @param tenantId 租户ID
     * @return 可撤回消息列表
     */
    List<DriverMessage> getRecallableMessages(Long tenantId);

    /**
     * 消息转发
     * 
     * @param messageId 消息ID
     * @param targetDriverIds 目标司机ID列表
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean forwardMessage(Long messageId, List<Long> targetDriverIds, Long tenantId);

    /**
     * 设置消息优先级
     * 
     * @param messageId 消息ID
     * @param priority 优先级
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean setMessagePriority(Long messageId, Integer priority, Long tenantId);

    /**
     * 获取高优先级消息列表
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 高优先级消息列表
     */
    List<DriverMessage> getHighPriorityMessages(Long driverId, Long tenantId);

    /**
     * 消息定时发送
     * 
     * @param driverId 司机ID
     * @param messageType 消息类型
     * @param title 消息标题
     * @param content 消息内容
     * @param scheduledTime 定时发送时间
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean scheduleMessage(Long driverId, Integer messageType, String title, String content, LocalDateTime scheduledTime, Long tenantId);

    /**
     * 获取定时消息列表
     * 
     * @param tenantId 租户ID
     * @return 定时消息列表
     */
    List<DriverMessage> getScheduledMessages(Long tenantId);

    /**
     * 取消定时消息
     * 
     * @param messageId 消息ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean cancelScheduledMessage(Long messageId, Long tenantId);

    /**
     * 处理定时消息
     * 
     * @param tenantId 租户ID
     * @return 处理结果
     */
    Map<String, Object> processScheduledMessages(Long tenantId);

    /**
     * 消息阅读回执
     * 
     * @param messageId 消息ID
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean confirmMessageRead(Long messageId, Long driverId, Long tenantId);

    /**
     * 获取消息阅读状态
     * 
     * @param messageId 消息ID
     * @param tenantId 租户ID
     * @return 阅读状态
     */
    Map<String, Object> getMessageReadStatus(Long messageId, Long tenantId);

    /**
     * 消息反馈
     * 
     * @param messageId 消息ID
     * @param driverId 司机ID
     * @param feedback 反馈内容
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean feedbackMessage(Long messageId, Long driverId, String feedback, Long tenantId);

    /**
     * 获取消息反馈列表
     * 
     * @param messageId 消息ID
     * @param tenantId 租户ID
     * @return 反馈列表
     */
    List<Map<String, Object>> getMessageFeedbacks(Long messageId, Long tenantId);
}